<?php
require_once 'Other/PHPMailer/class.phpmailer.php';
/**
 * 
 * 
 * @author nrnwest@gmail.com
 *
 */
class Arm_Mail extends PHPMailer
{

  /**
   * @var array $_configMailApp
   */
  private $_configMailApp = null;
  
  /**
   * Zend_View
   * 
   * @var Zend_View
   */
  private $_view;
    
  public function __construct()
  {
    // бросать исключения
    parent::__construct(true);
    $this->_configMailApp = Arm_Core::getConfigApplication()->mail->toArray();
    $this->CharSet = $this->_configMailApp['charsetMessage'];
    // Установка транспорта
    $this->setTransport();
    $this->_setView();
  }
  
  /**
   * Zend_View
   * 
   * @return Zend_View
   */
  private function _setView()
  {
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
        /*@var Zend_View $view*/
        $this->_view = clone $viewRenderer->view;
        // нужно установить директорию к директории шаблонов сообщений
        $this->_view->clearVars();
        $module = strtolower(Zend_Controller_Front::getInstance()->getRequest()->getModuleName());
        $this->_view->setScriptPath(Arm_Core::getPathModule($module)  . 'views/_messages');
        return;
  }
  
  /**
   * Установка тела сообщения с помощью шаблона вида
   * 
   * @param string $scriptName названия файла шаблона вида, без расширения файла
   *               скрипт должен находиться в текущей директории модуля views/_messages
   * @param array $data масив с данным в подстановку шаблона вида.
   * @param bool $iconv если передать false система не будет переводить сообщения в другую кодировку
   */
  public function setBodyTemplate($scriptName, $data=array(), $iconv=true)
  {
     if(array_key_exists('mail', $data) === true) {
         throw new Arm_Mail_Exception(Arm_Translate::_('ключ mail запрещен он зарезирвирован системой'));
     }
     $data['mail'] = $this;
     $this->_view->assign($data);
     $result = $this->_view->render($scriptName . '.' .
     Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer')->getViewSuffix());
     $this->setBody($result, $iconv);
     return;
  }
  
  /**
   * Установка транспорта
   * @param array $config масив должен содержать ключи такиеже как раздел mail.transport в конфиге application.ini
   */
  public function setTransport(array $config = array())
  {
    if($config !== array()) {
      $this->_configMailApp['transport'] = $config;
    }  
    $ct = $this->_configMailApp['transport'];
    if($ct['adapter'] === 'mail') {
        return;
    }
    if($ct['adapter'] === 'smtp') {
        // установка параметров для smtp
        
        // нужна авторизация на pop servere
        if($ct['smtp']['authpop'] === '1') {
            if($this->_authPopServer() === false) {
                throw new Arm_Mail_Exception(Arm_Translate::_('Неудалось авторизоваться на pop3 сервере, отправка сообщений не возможна'));
            }
        }
        // нужна авторизация на smtp сервере
        if($ct['smtp']['auth'] === '1') {
            $this->SMTPAuth = true;
            // установка пользователя smtp серевера
            $this->Username = $ct['smtp']['user'];
            $this->Password = $ct['smtp']['password'];
        }
        $this->SMTPSecure = $ct['smtp']['secure'];
        $this->Host = $ct['smtp']['server'];
        $this->Port = $ct['smtp']['port'];
        return;
    }
    // бросаем исключение только отправка через функцию mail или smtp
    throw new Arm_Mail_Exception(Arm_Translate::_('Реализованна отправка через smtp сервер или mail функцию php'));
  }
  
  /**
   * Аунтификация на pop сервере перед отправкой сообщения, некоторые
   * smtp серверы этого требуют.
   * 
   * @return bool
   */
  private function _authPopServer()
  {
     require_once 'Other/PHPMailer/class.pop3.php';
     $pop = new POP3();
     $pc  = $this->_configMailApp['transport'];
     return $pop->Authorise($pc['pop3']['server'], $pc['pop3']['port'], false, $pc['smtp']['user'], $pc['smtp']['password']); 
  }
  
  /**
   * Перекодирует стороку в кодировку сообщения, если кодировка mail отличаеться 
   * от системной.
   * 
   * @param string $string
   * @param bool $iconv если передать false система не будет переводить сообщения в другую кодировку
   */
  public function iconvString($string, $iconv = true)
  {
      if($string === '' or $iconv === false) {
          return $string;
      }
      $systemCharset = Arm_core::getConfigApplication()->system->charset;
      if(strtolower($this->CharSet) === strtolower($systemCharset)) {
          return $string;
      }
      return iconv($systemCharset, $this->CharSet . '//TRANSLIT', $string);
  }
  
  /**
   * Установка получателя
   * @param unknown_type $address
   * @param unknown_type $name
   */
  public function AddAddress($address, $name = '')
  {
     return parent::AddAddress($address, $this->iconvString($name));
  }

 /**
  * установка получателя копии сообщения
  * @param unknown_type $address
  * @param unknown_type $name
  */
 public function AddCC($address, $name = '')
  {
     return parent::AddCC($address, $this->iconvString($name));
  }

/**
 * установка получателей скрытой копии
 * @param $address
 * @param $name
 */
public function AddBCC($address, $name = '')
  {
     return parent::AddBCC($address, $this->iconvString($name));
  }

/**
 * установка адресса для ответа
 * @param $address
 * @param $name
 */
public function AddReplyTo($address, $name = '')
  {
     return parent::AddReplyTo($address, $this->iconvString($name));
  }
  
  /**
   * установка адреса и имени отправителя
   * @param unknown_type $address
   * @param unknown_type $name
   * @param unknown_type $auto
   */
  public function setFrom($address, $name = '',$auto=1)
  {
     return parent::SetFrom($address, $this->iconvString($name), $auto);
  }
  
  /**
   * Установка тела сообщения
   * @param unknown_type $body
   * @param bool $iconv если передать false система не будет переводить сообщения в другую кодировку
   */
  public function setBody($body, $iconv = true)
  {
     $this->Body = $this->iconvString($body, $iconv);
     return;
  }
  
  /**
   * Установка темы сообщения
   * @param unknown_type $subject
   * @param bool $iconv если передать false система не будет переводить сообщения в другую кодировку
   */
  public function setSubject($subject, $iconv=true)
  {
     $this->Subject = $this->iconvString($subject, $iconv);
     return;
  }
   /**
   * Adds an attachment from a path on the filesystem.
   * Returns false if the file could not be found
   * or accessed.
   * @param string $path Path to the attachment.
   * @param string $name Overrides the attachment name.
   * @param string $encoding File encoding (see $Encoding).
   * @param string $type File extension (MIME) type.
   * @return bool
   */
  public function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') 
  {
      return parent::AddAttachment($path, $this->iconvString($name), $encoding, $type);
  }
  
    /**
   * Adds a string or binary attachment (non-filesystem) to the list.
   * This method can be used to attach ascii or binary data,
   * such as a BLOB record from a database.
   * @param string $string String attachment data.
   * @param string $filename Name of the attachment.
   * @param string $encoding File encoding (see $Encoding).
   * @param string $type File extension (MIME) type.
   * @return void
   */
  public function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') 
  {
      return parent::AddStringAttachment($string, $this->iconvString($filename), $encoding, $type);
  }
  
    /**
   * Adds an embedded attachment.  This can include images, sounds, and
   * just about any other document.  Make sure to set the $type to an
   * image type.  For JPEG images use "image/jpeg" and for GIF images
   * use "image/gif".
   * @param string $path Path to the attachment.
   * @param string $cid Content ID of the attachment.  Use this to identify
   *        the Id for accessing the image in an HTML form.
   * @param string $name Overrides the attachment name.
   * @param string $encoding File encoding (see $Encoding).
   * @param string $type File extension (MIME) type.
   * @return bool
   */
  public function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') 
  {
      return parent::AddEmbeddedImage($path, $cid, $this->iconvString($name), $encoding, $type);
  }
  
  /**
   * Evaluates the message and returns modifications for inline images and backgrounds
   * @param bool $iconv если передать false система не будет переводить сообщения в другую кодировку
   * @return $message
   */
  public function MsgHTML($message, $basedir = '', $iconv = true) 
  {
      return parent::MsgHTML($this->iconvString($message, $iconv), $basedir = '');
  }
      
  
  
}